﻿#define _CRT_SECURE_NO_WARNINGS 1

//基本的内置类型
//char        //字符数据类型
//short       //短整型
//int         //整形
//long        //长整型
//long long   //更长的整形
//float       //单精度浮点数
//double      //双精度浮点数

//字符在存储的时候存储的是ASCII码值, ASCII是整数, 所以在归类的时候, 字符属于整型家族
//char 到底是signed char 还是unsigned char是取决于编译器的
//常见的编译器上char == signed char

//整型家族
//char
//unsigned char
//signed char
// 
//short
//unsigned short[int]
//signed short[int]
// 
//int
//unsigned int
//signed int
// 
//long
//unsigned long[int]
//signed long[int]

//浮点数家族
//float
//double

//构造类型(自定义类型):
//数组类型
//结构体类型 struct
//枚举类型 enum
//联合类型 union

//指针类型
//int* pi;
//char* pc;
//float* pf;
//void* pv;

//空类型
//void 表示空类型(无类型)
//通常应用于函数的返回类型, 函数的参数, 指针类型

//原码, 反码, 补码
//原码
//直接将数值按照正负数的形式翻译成二进制就可以得到原码
//反码
//将原码的符号位不变, 其他位依次按位取反就可以得到反码
//补码
//反码+1就得到补码

//对于整形来说:数据存放内存中其实存放的是补码
//在计算机系统中, 数值一律用补码来表示和存储
//原因在于, 使用补码, 可以将符号位和数值域统一处理
//同时, 加法和减法也可以统一处理(CPU只有加法器)
//此外, 补码与原码相互转换, 其运算过程(先取反,再+1)
//是相同的, 不需要额外的硬件电路

//大端字节序存储模式, 是指数据的低位保存在内存的高地址中, 而数据的高位, 保存在内存的低地址中
//小端字节序存储模式, 是指数据的低位保存在内存的低地址中, 而数据的高位, 保存在内存的高地址中

//设计一个小程序来判断当前机器的字节序
//#include <stdio.h>
//check_sys()
//{
//	int a = 1;
//	return *(char*)&a;
//}
//
//int main()
//{
//	int ret = check_sys();
//	if (1 == ret)
//		printf("小端\n");
//	else
//		printf("大端\n");
//
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	char a = -1;
//	//-1 是整数, 32bit
//	//10000000000000000000000000000001
//	//11111111111111111111111111111110
//	//11111111111111111111111111111111
//	//11111111 - a  截断
//	//11111111111111111111111111111111 - 提升
//	
//	signed char b = -1;
//	unsigned char c = -1;
//	//10000000000000000000000000000001
//	//11111111111111111111111111111110
//	//11111111111111111111111111111111
//	//00000000000000000000000011111111
//	//
//	//      -1    -1   255
//	printf("a=%d,b=%d,c=%d", a, b, c);
//	//%d是打印有符号的整数
//	
//	return 0;
//}
//

//#include <stdio.h>
//int main()
//{
//	char a = -128;
//	//10000000000000000000000010000000
//	//11111111111111111111111101111111
//	//11111111111111111111111110000000 -128的补码
//	//10000000 - a
//	//11111111111111111111111110000000
//	printf("%u\n", a);  //4294967168
//
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	char a = 128;
//	//128
//	//00000000000000000000000010000000
//	//10000000 - a
//	//11111111111111111111111110000000
//	//
//	printf("%u\n", a);  //4294967168
// 
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	char a = 128;
//	printf("%d\n", a);  //-128
//
//	return 0;
//}

//char -128~127
//unsigned char 0~255
//0~127 -128~-1(+1的效果)

//按照补码的形式进行运算, 最后格式化成为有符号整数
//int main()
//{
//	int i = -20;
//	unsigned int j = 10;
//	//10000000000000000000000000010100
//	//11111111111111111111111111101011
//	
//	//11111111111111111111111111101100
//	//00000000000000000000000000001010
//	//11111111111111111111111111110110 - 补码
//	//11111111111111111111111111110101
//	//10000000000000000000000000001010
//	//-10
//	printf("%d\n", i + j);  //-10
//
//	return 0;
//}

//#include <windows.h>
//#include <stdio.h>
//int main()
//{
//	unsigned int i;
//	for (i = 9; i >= 0; i--)
//	{
//		printf("%u\n", i);
//		Sleep(1000);
//	}
//
//	return 0;
//}  //9 8 7 6 5 4 3 2 1 0 4294967295....死循环

//#include <stdio.h>
//#include <string.h>
//int main()
//{
//	char a[1000];
//	int i;
//	for (i = 0; i < 1000; i++)
//	{
//		a[i] = -1 - i;
//	}
//	//128 + 127 
//	//-1 -2 -3 -4 -5 .. -128 127 126 .... 5 4 3 2 1 0 -1 -2 ...
//	printf("%d", strlen(a));//'\0' -- 0
//	//
//	return 0;
//}

//unsigned char 的取值范围为0~255
//#include <stdio.h>
//unsigned char i = 0;
//int main()
//{
//	for (i = 0; i <= 255; i++)
//	{
//		printf("hello world\n");
//	}
//	return 0;
//}  //死循环地打印 hello world

//整型的取值范围:limits.h 中查看
//浮点型的取值范围:float.h 中查看

//浮点数的存储-SME法则
//int main()
//{
//	int n = 9;
//	float* pFloat = (float*)&n;
//
//	printf("n的值为：%d\n", n);  //9
//	printf("*pFloat的值为：%f\n", *pFloat);  //9.0
//
//	*pFloat = 9.0;
//	printf("num的值为：%d\n", n);  //9
//	printf("*pFloat的值为：%f\n", *pFloat);  //9.0
//	return 0;
//}
//
//int main()
//{
//	float f = 3.14;
//
//	//0.14
//	//0.125
//	//0.015
//	//11.001....01010000010101010101010101010
//	// 
//	//float f = 9.0;
//	//1001.0
//	//(-1) ^ 0 * 1.001 *2^3
//	//s = 0
//	//e = 3
//	//M = 1.001
//	//0100 0001 0001 00000000000000000000
//	//0x41 10 00 00
//	// 
//	//float f = 5.5f;
//	//101.1
//	//1.011 *2^2
//	//(-1)^0 *1.011 * 2^2
//	//s=0
//	//m=1.011
//	//e=2
//	//0 10000001 01100000000000000000000
//	//
//	//40 b0 00 00
//	//
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int n = 9;
//	//00000000000000000000000000001001 - 9的补码
//	//0 00000000 00000000000000000001001
//	//(-1)^0 * 0.00000000000000000001001 * 2^-126
//	//0.000000
//
//	float* pFloat = (float*)&n;
//
//	printf("n的值为：%d\n", n);  //9
//	printf("*pFloat的值为：%f\n", *pFloat);  //0.000000
//
//
//	*pFloat = 9.0;
//	//1001.0
//	//(-1)^0 * 1.001 * 2^3
//	//s=0
//	//e=3
//	//m=1.001
//	//01000001000100000000000000000000
//	
//	printf("num的值为：%d\n", n);  //1,091,567,616
//	printf("*pFloat的值为：%f\n", *pFloat);  //9.0
//	return 0;
//}